/*
 * Estadistico.cpp
 *
 *  Created on: 23/06/2010
 *      Author: ignacio
 */

#include "Estadistico.h"

Estadistico* Estadistico::instancia = NULL;
unsigned int Estadistico::ordenMaximoPPMC = 0;

Estadistico::Estadistico(int ordenMaximoPPMC)
{
	/*
	 * Cantidad de accesos por contexto.
	 * La posicion del array se corresponde con el orden del contexto
	 */
	this -> cantidadAccesos = new typeFrecuencias [ordenMaximoPPMC + 1];

	/*
	 * Cantidad de aciertos por contexto.
	 * La posicion del array se corresponde con el orden del contexto
	 */
	this -> cantidadAciertos = new typeFrecuencias [ordenMaximoPPMC + 1];
}

Estadistico* Estadistico::getInstancia()
{
	if (instancia == NULL)
	{
		instancia = new Estadistico(ordenMaximoPPMC);
	}
	return instancia;
}

void Estadistico::borrarInstancia()
{
	delete instancia;
	instancia = NULL;
}

Estadistico::~Estadistico(){}

//void Estadistico::calcularAciertosPorContexto()
//{
//
//	int ordenContexto;
//	typeFrecuencias cantidadAciertos, cantidadAccesos, frecuenciaESC;
//
//	Contexto* contexto = this -> ppmc -> primerContexto();
//
//	while (contexto != NULL)
//	{
//		ordenContexto = contexto -> getOrden();
//
//		frecuenciaESC = contexto -> getDistribucion(Distribucion::CARACTER_ESCAPE) -> getFrecuencia();
//		cantidadAccesos = contexto -> getTotalFrecuencias() - frecuenciaESC;
//		cantidadAciertos = cantidadAccesos - frecuenciaESC;
//
//		this -> cantidadAccesos[ordenContexto] += cantidadAccesos;
//		this -> cantidadAciertos[ordenContexto] += cantidadAciertos;
//
//		this -> ppmc -> getSiguienteContexto();
//	}
//}

void Estadistico::setOrdenMaximoPPMC(int ordenMaximo)
{
	ordenMaximoPPMC = ordenMaximo;
}

void Estadistico::sumarAcceso(int orden)
{
	this -> cantidadAccesos[orden] += 1;
}

void Estadistico::sumarAcierto(int orden)
{
	this -> cantidadAciertos [orden] += 1;
}

void Estadistico::printAciertosPorContexto()
{
	for (unsigned int i = 0; i < ordenMaximoPPMC + 1; i++)
	{
		std::cout << "Contexto orden " << i << std::endl;
		std::cout << "# Accesos = " << this -> cantidadAccesos[i] << std::endl;
		std::cout << "# Aciertos = " << this -> cantidadAciertos[i] << std::endl;
		std::cout << std::endl;
	}
}
